#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
配置检查脚本
用于验证当前配置的正确性和完整性
"""

import os
import sys
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

def main():
    """主函数"""
    print("🔍 体育场馆预约系统 - 配置检查")
    print("=" * 60)
    
    try:
        # 添加父目录到系统路径
        sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
        
        # 导入配置验证工具
        from app.utils.config_validator import validate_config, print_validation_results
        
        # 获取当前配置
        config_dict = get_current_config()
        
        # 验证配置
        is_valid, errors, warnings = validate_config(config_dict)
        
        # 打印结果
        print_validation_results(is_valid, errors, warnings)
        
        # 检查环境文件
        check_env_file()
        
        # 检查目录结构
        check_directory_structure()
        
        # 检查数据库连接
        check_database_connection()
        
        if is_valid and not errors:
            print("\n🎉 配置检查完成，系统可以正常启动！")
            return 0
        else:
            print("\n⚠️ 请修复上述问题后重新检查")
            return 1
            
    except ImportError as e:
        print(f"❌ 导入错误: {e}")
        print("请确保已安装所有依赖: pip install -r requirements.txt")
        return 1
    except Exception as e:
        print(f"❌ 检查失败: {e}")
        return 1


def get_current_config():
    """获取当前配置"""
    config_dict = {}
    
    # 基础配置
    config_dict['SECRET_KEY'] = os.environ.get('SECRET_KEY', '')
    config_dict['FLASK_ENV'] = os.environ.get('FLASK_ENV', 'development')
    config_dict['HOST'] = os.environ.get('HOST', '0.0.0.0')
    config_dict['PORT'] = int(os.environ.get('PORT', 5000))
    
    # 数据库配置
    config_dict['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', '')
    config_dict['MYSQL_PORT'] = int(os.environ.get('MYSQL_PORT', 3306))
    config_dict['MYSQL_USER'] = os.environ.get('MYSQL_USER', '')
    config_dict['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', '')
    config_dict['MYSQL_DATABASE'] = os.environ.get('MYSQL_DATABASE', '')
    
    # 数据库连接池配置
    config_dict['DB_POOL_SIZE'] = int(os.environ.get('DB_POOL_SIZE', 10))
    config_dict['DB_POOL_TIMEOUT'] = int(os.environ.get('DB_POOL_TIMEOUT', 20))
    config_dict['DB_POOL_RECYCLE'] = int(os.environ.get('DB_POOL_RECYCLE', 3600))
    config_dict['DB_MAX_OVERFLOW'] = int(os.environ.get('DB_MAX_OVERFLOW', 0))
    config_dict['DB_ECHO'] = os.environ.get('DB_ECHO', 'false').lower() == 'true'
    
    # JWT配置
    config_dict['JWT_SECRET_KEY'] = os.environ.get('JWT_SECRET_KEY', '')
    config_dict['JWT_EXPIRES_HOURS'] = int(os.environ.get('JWT_EXPIRES_HOURS', 24))
    
    # 微信配置
    config_dict['WECHAT_APPID'] = os.environ.get('WECHAT_APPID', '')
    config_dict['WECHAT_SECRET'] = os.environ.get('WECHAT_SECRET', '')
    
    # 跨域配置
    config_dict['CORS_ORIGINS'] = os.environ.get('CORS_ORIGINS', '')
    
    # 文件上传配置
    config_dict['UPLOAD_FOLDER'] = os.environ.get('UPLOAD_FOLDER', 'uploads')
    config_dict['MAX_CONTENT_LENGTH'] = int(os.environ.get('MAX_CONTENT_LENGTH', 16 * 1024 * 1024))
    
    # 日志配置
    config_dict['LOG_LEVEL'] = os.environ.get('LOG_LEVEL', 'INFO')
    config_dict['LOG_FILE'] = os.environ.get('LOG_FILE', 'logs/app.log')
    
    return config_dict


def check_env_file():
    """检查环境文件"""
    print("\n📁 环境文件检查:")
    print("-" * 30)
    
    # 切换到项目根目录
    project_root = os.path.join(os.path.dirname(__file__), '..')
    env_files = ['.env', 'env_template.txt', 'env_example.txt']
    
    for env_file in env_files:
        env_path = os.path.join(project_root, env_file)
        if os.path.exists(env_path):
            print(f"✅ 找到环境文件: {env_file}")
        else:
            print(f"❌ 缺少环境文件: {env_file}")
    
    if not os.path.exists('.env'):
        print("\n💡 建议:")
        print("  1. 复制 env_template.txt 为 .env")
        print("  2. 在 .env 中填入实际配置")
        print("  3. 确保 .env 文件不被提交到版本控制")


def check_directory_structure():
    """检查目录结构"""
    print("\n📂 目录结构检查:")
    print("-" * 30)
    
    # 切换到项目根目录
    project_root = os.path.join(os.path.dirname(__file__), '..')
    required_dirs = [
        'uploads',
        'logs',
        'app',
        'app/api',
        'app/models',
        'app/config'
    ]
    
    for directory in required_dirs:
        dir_path = os.path.join(project_root, directory)
        if os.path.exists(dir_path):
            print(f"✅ 目录存在: {directory}")
        else:
            print(f"❌ 目录缺失: {directory}")
            if directory in ['uploads', 'logs']:
                try:
                    os.makedirs(dir_path)
                    print(f"✅ 已创建目录: {directory}")
                except Exception as e:
                    print(f"❌ 创建目录失败: {directory} - {e}")


def check_database_connection():
    """检查数据库连接"""
    print("\n🗄️ 数据库连接检查:")
    print("-" * 30)
    
    try:
        # 尝试导入数据库相关模块
        from app import create_app
        from app.extensions import db
        
        app = create_app('development')
        
        with app.app_context():
            # 尝试连接数据库
            with db.engine.connect() as connection:
                result = connection.execute(db.text('SELECT 1'))
                print("✅ 数据库连接成功")
            
    except ImportError as e:
        print(f"❌ 数据库模块导入失败: {e}")
    except Exception as e:
        print(f"❌ 数据库连接失败: {e}")
        print("💡 请检查:")
        print("  1. 数据库服务是否启动")
        print("  2. 数据库配置是否正确")
        print("  3. 数据库用户权限是否足够")


if __name__ == '__main__':
    sys.exit(main()) 